function ColorToString(value) {
  return JSON.stringify({
    ColorIndex: value.ColorIndex,
    ColorMethod: value.ColorMethod,
    EntityColor: value.EntityColor
  })
}

function PointToString(value) {
  return JSON.stringify({
    x: value.x,
    y: value.y,
    z: value.z
  })
}

// f - 表示key(ocx对象属性)
// c - 表示column(数据库字段名,驼峰命名法,camelCase)
const RxObject = [
  { key: 'Dxf0', column: 'dxf0' }, // DXF名称
  { key: 'ObjectName', column: 'objectName' } // C++类名
]

const DbObject = [
  // { key: 'Database', column: 'database' }, // 数据库
  { key: 'Handle', column: 'handle' }, // 句柄
  { key: 'HasExtensionDictionary', column: 'hasExtensionDictionary' }, // 是否启用了扩展词典
  { key: 'ObjectID', column: 'objectId' }, // 对象ID
  { key: 'OwnerID', column: 'ownerId' } // 拥有者ID
]

const SymbolTableRecord = [{ key: 'Name', column: 'name' }]

const LayerTableRecord = [
  { key: 'Color', column: 'color', factory: value => ColorToString(value) }, // 返回图层的颜色
  { key: 'IsFrozen', column: 'isFrozen' }, // 返回图层是否处于冻结状态
  { key: 'IsLocked', column: 'isLocked' }, // 返回图层是否处于锁定状态
  { key: 'IsOff', column: 'isOff' }, // 返回图层是否处于关闭状态
  { key: 'LinetypeObjectId', column: 'lineTypeObjectId' }, // 返回图层的线型样式id
  { key: 'LineWeight', column: 'lineWeight' }
]

const BlockTableRecord = [
  { key: 'Origin', column: 'origin' } // 块表记录的插入原点属性
]

const LinetypeTableRecord = [
  { key: 'Comments', column: 'comments' }, // 返回线型说明字符串
  { key: 'NumDashes', column: 'numDashes' } // 返回线型样式中线型定义数组的长度
]

const TextStyleTableRecord = [
  { key: 'bigFontFileName', column: 'bigFontFileName' }, // 返回文字的big shx文件名
  { key: 'fileName', column: 'fileName' }, // 返回文字的shx文件名
  { key: 'isShapeFile', column: 'isShapeFile' }, // 返回该记录是否是一个形文件
  { key: 'isVertical', column: 'isVertical' }, // 返回文字是否竖向绘制
  { key: 'obliquingAngle', column: 'obliquingAngle' }, // 返回文字显示时的倾斜角（弧度）。有效范围为-1.48335至+1.4835 弧度（-85至85度）
  { key: 'textSize', column: 'textSize' }, // 返回文字的高度
  { key: 'xScale', column: 'xscale' } // 返回文字的宽度缩放比例
]

const Database = [
  { key: 'CurrentlyColorIndex', column: 'currentlyColorIndex' }, // 当前绘图的CAD索引颜色属性
  { key: 'CurrentlyDimstyleName', column: 'currentlyDimstyleName' }, // 返回当前标注样式名
  { key: 'CurrentlyLayerName', column: 'currentlyLayerName' }, // 当前图层属性
  { key: 'CurrentlyLineTypeName', column: 'currentlyLineTypeName' }, // 当前线型属性
  { key: 'CurrentlyLineTypeScale', column: 'currentlyLineTypeScale' }, // 返回新增加到数据库的对象的默认线型缩放比例
  { key: 'CurrentlyTextStyle', column: 'currentlyTextStyle' }, // 当前的文字样式风格属性
  {
    key: 'CurrentlyTrueColor',
    column: 'currentlyTrueColor',
    factory: value => ColorToString(value)
  }, // 当前绘图颜色，RGB色
  { key: 'Insbase', column: 'insbase', factory: value => PointToString(value) }, // 数据库当着图块插入时，插入原点位置
  { key: 'LineTypeScale', column: 'lineTypeScale' } // 返回数据库中的全局线型缩放比例，该变量会立即影响线型的显示
]

function GetSymbolTableData(keys, obj) {
  const data = {}
  keys.forEach(item => {
    let val = null
    try {
      const key = item.key.trim()
      val = obj[key]
    } catch (err) {
      console.error('[ERROR]GetSymbolTableData:', '错误:', err)
    }
    if (val === null || val === undefined) {
      val = ''
    } else {
      const f = item.factory
      if (f && typeof f === 'function') {
        val = f(val)
      }
    }
    // 传送到服务器的是camelCase字段
    let column = item.column
    if (!column) {
      // 如果没有定义数据库的column,则默认取key的首字母小写作为column
      column = item.key.trim()
      // 首字母小写
      column.replace(column[0], column[0].toLowerCase())
    }
    data[column] = val
  })
  return data
}

function GetLayerTableData(obj) {
  return GetSymbolTableData(
    [...RxObject, ...DbObject, ...SymbolTableRecord, ...LayerTableRecord],
    obj
  )
}

function GetLinetypeTableData(obj) {
  return GetSymbolTableData(
    [...RxObject, ...DbObject, ...SymbolTableRecord, ...LinetypeTableRecord],
    obj
  )
}

function GetBlockTableData(obj) {
  return GetSymbolTableData(
    [...RxObject, ...DbObject, ...SymbolTableRecord, ...BlockTableRecord],
    obj
  )
}

function GetTextStyleTableData(obj) {
  return GetSymbolTableData(
    [...RxObject, ...DbObject, ...SymbolTableRecord, ...TextStyleTableRecord],
    obj
  )
}

function GetDatabaseData(obj) {
  return GetSymbolTableData([...RxObject, ...Database], obj)
}

export {
  GetLayerTableData,
  GetLinetypeTableData,
  GetTextStyleTableData,
  GetBlockTableData,
  GetDatabaseData
}
